package net.imagine.provider.skyline;

import java.io.IOException;
import java.io.InputStream;

import net.imagine.core.FileKeyGenerator;
import net.imagine.core.resize.ImageResizeTask;

import org.springframework.web.multipart.MultipartFile;

/**
 * 基于Spring {@link MultipartFile}的图片压缩任务实现
 * 
 * @author wuqh
 * @see ImageResizeTask
 */
public class MultipartImageResizeTask extends SkylineImageResizeTask {
	private final MultipartFile multipartFile;
	private final int[] baseSizes;
	private final String defaultFilename;
	private final boolean useDefault;
	private String localStorePath;

	/***************************************************************************
	 * @param multipartFile
	 *            上传的图片文件封装对象
	 * @param baseSizes
	 *            要压缩的最大长/宽值数列
	 * @param defaultFilename
	 *            压缩后使用的文件名
	 * @param useDefault
	 *            是否使用defaultFilename
	 **************************************************************************/
	public MultipartImageResizeTask(MultipartFile multipartFile, int[] baseSizes, String defaultFilename,
			boolean useDefault) {
		this.multipartFile = multipartFile;
		if(baseSizes != null) {
			this.baseSizes = baseSizes.clone();
		} else {
			this.baseSizes = null;
		}
		this.defaultFilename = defaultFilename;
		this.useDefault = useDefault;
		this.localStorePath = null;
	}

	@Override
	public int[] getBaseSizes() {
		if(baseSizes == null) {
			return null;
		}
		return baseSizes.clone();
	}

	@Override
	public byte[] getData() throws IOException {
		return multipartFile.getBytes();
	}

	@Override
	public long getFileSize() {
		return multipartFile.getSize();
	}

	@Override
	public String getFilename() {
		return multipartFile.getOriginalFilename();
	}

	@Override
	public InputStream getInputStream() throws IOException {
		return multipartFile.getInputStream();
	}

	/**
	 * <pre>
	 * 图片文件的默认名，与{@link #useDefault()}配合使用
	 * 1、如果{@link #useDefault()}结果为true，
	 * 则在压缩时将使用{@link #getDefaultFilename()}的返回值作为图片压缩后的文件名
	 * 2、如果{@link #useDefault()}结果为false，
	 * 使用{@link FileKeyGenerator#generateFileKey()}
	 * 或者{@link FileKeyGenerator#generateFileKeys(int)}来生产图片压缩后的文件名
	 * </pre>
	 * 
	 * @return 图片文件的默认文件名
	 */
	public String getDefaultFilename() {
		return defaultFilename;
	}

	/**
	 * 压缩是否使用默认文件名
	 * 
	 * @return 如果使用默认文件名则true，否则false
	 */
	public boolean isUseDefault() {
		return useDefault;
	}

	@Override
	public String getLocalStorePath() {
		return this.localStorePath;
	}

	@Override
	public void setLocalStorePath(String localStorePath) {
		this.localStorePath = localStorePath;
	}
	
	public String getOriginalFilename() {
		return this.multipartFile.getOriginalFilename();
	}

	@Override
	public String getRemoteFileKey() {
		return null;
	}

}